import axios from 'axios'
import {message} from 'antd'
import {throttle, debounce} from 'lodash'
import Login from "../page/Login/Login";

const statusCode = {
    401: '身份验证失败，请重新登录',
    500: '服务器相关内部错误，请联系相关管理员',
    404: '当前接口不存在,请联系相关人员',
}

// 请求拦截器
axios.interceptors.request.use(
    function (config) {
        // Do something before request is sent
        let token = window.sessionStorage.getItem('token')
        if (token) {
            config.headers['x-access-token'] = token //将token放到请求头发送给服务器
            return config
            //这里经常搭配token使用，将token值配置到tokenkey中，将tokenkey放在请求头中
            // config.headers['accessToken'] = Token;
        }
        return config
    },
    function (error) {
        return Promise.reject(error)
    }
)

// 响应拦截器
axios.interceptors.response.use(
    response => {
        // 如果返回的状态码为200，说明接口请求成功，可以正常拿到数据
        // 否则的话抛出错误
        if (response.status === 200 || response.status === 201) {
            return Promise.resolve(response)
        } else {
            return Promise.reject(response)
        }
    },
    // 服务器状态码不是2开头的的情况
    // 这里可以跟你们的后台开发人员协商好统一的错误状态码
    // 然后根据返回的状态码进行一些操作，例如登录过期提示，错误提示等等
    // 下面列举几个常见的操作，其他需求可自行扩展
    error => {
        if (error.response && error.response.status) {
            switch (error.response.status) {
                // 401: 未登录
                // 未登录则跳转登录页面，并携带当前页面的路径
                // 在登录成功后返回当前页面，这一步需要在登录页操作。
                case 401:
                    //throttle
                    cdebounce(msgError, error.response.data.message, 2000)
                    break

                // 403 token过期
                // 登录过期对用户进行提示
                // 清除本地token和清空vuex中token对象
                // 跳转登录页面
                case 403:
                    message.error(error.response.data.errorMessage)
                    // window.localStorage.clear();
                    // window.location = '/login'
                    break
                // 404请求不存在
                case 404:
                    message.error('您访问的网页不存在。')
                    break
                case 500:
                    message.error(error.response.data.message)
                    break
                // 其他错误，直接抛出错误提示
                default:
                    message.error(error.response.data.message)
            }
            return Promise.reject(error.response)
        } else {
            console.error(error)
        }
    }
)

function msgError(msg) {
    message.error(msg, {}, () => {
        window.localStorage.clear()
        window.location = '/login'
    })
}

let status = true

function cdebounce(fn, params, num) {
    if (status) {
        status = false
        fn(params)
        setTimeout(() => {
            status = true
        }, num)
    }
}

/**
 *
 * @param url 接口地址
 * @param params 参数
 * @param isApi 是否需要前缀api(代理)
 * @param method get||post
 * @param option
 * @returns {AxiosPromise}
 */
export function http(url: string, params = {}, isApi = true, method = 'get', option?: any) {
    // @ts-ignore
    const api = import.meta.env.VITE_APP_URL_API;
    return axios({
        method: method,
        url: isApi ? api + url : url,
        data: params,
        ...option,
    })
}
